#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <cerrno>
#include <cstring>

using namespace std;

__thread int g_val = 0;

void* threadRoutine(void* args)
{
    pthread_detach(pthread_self());
    while(1)
    {
        cout << (char*)args << "  g_val:" << g_val << "  &g_val:" << &g_val << endl;
        g_val++;
        int a = 100;
        a /= 0;
        break;
    }
    pthread_exit((void*)11);
}

int main()
{
    pthread_t tid;
    pthread_create(&tid, nullptr, threadRoutine, (void*)"thread 1");

    while(1)
    {
        cout << "main thread" << "  g_val:" << g_val << "  &g_val:" << &g_val << endl;
        sleep(1);
        break;
    }

    return 0;
}   


// void* threadRoutine(void* args)
// {
//     int i = 0;
//     int* ret = new int[7];
//     while(1)
//     {
//         cout << "新线程: " << (char*)args << " running ..." << endl;
//         sleep(1);
//         ret[i] = i;
//         if(i++ == 6) break;
//     }
//     cout << (char*)args << " quit" << endl;
//     return (void*)ret;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRoutine, (void*)"thread one");

//     int* ret = nullptr;
//     pthread_join(tid, (void**)&ret);
//     for(int i = 0; i < 7; ++i)
//         cout << ret[i] << ' ';
    
//     cout << endl;
//     cout << "ret: "<< (long long)ret << " main thread wait done... main quit too" << endl;

//     return 0;
// }

// void* threadRoutine(void* args)
// {
//     int i = 0;
//     while(1)
//     {
//         cout << "新线程: " << (char*)args << " running ..." << pthread_self() << endl;
//         sleep(1);
//     }
//     cout << (char*)args << " quit" << endl;
//     pthread_exit((void*)13);
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadRoutine, (void*)"thread one");

//     int count = 0;
//     while(1)
//     {
//         cout << "main线程 running ..." << pthread_self() << endl;
//         sleep(2);
//         count++;
//         if(count == 5) break;
//     }

//     pthread_cancel(tid);
//     cout << "pthread cancel tid: " << tid << endl;

//     void* ret = nullptr;
//     pthread_join(tid, &ret);
//     cout << "ret: "<< (long long)ret << " main thread wait done... main quit too" << endl;

//     return 0;
// }


// #include <iostream>
// #include <string>
// #include <unistd.h>
// #include <cassert>
// #include <sys/types.h>
// #include <sys/wait.h>

// using namespace std;

// int globalVal = 100;

// int main()
// {
//     int id = fork();
//     assert(id != -1);
    
//     if(id == 0)
//     {
//         // child process
//         int count = 0;
//         while(1)
//         {
//             cout << "child process -> globalVal: " << globalVal << endl;
//             sleep(1);
//             ++count;
//             if(count == 5)
//             {
//                 globalVal = 200;
//                 cout << "child process change globalVal!" << endl;
//             }
//         }
//     }

//     // parent process
//     while(1)
//     {
//         cout << "parent process -> globalVal: " << globalVal << endl;
//         sleep(1);
//     }

//     return 0;
// }


// #include <iostream>
// #include <string>
// #include <cstdio>
// #include <unistd.h>
// #include <pthread.h>

// using namespace std;

// int x = 100;

// void show(const string &name)
// {
//     cout << name << ", pid: " << getpid() << " " << x << "\n"
//          <<  endl;
// }

// void *threadRun(void *args)
// {
//     const string name = (char *)args;
//     while (true)
//     {
//         show(name);
//         sleep(1);
//     }
// }

// int main()
// {
//     pthread_t tid[5];
//     char name[64];
//     for (int i = 0; i < 5; i++)
//     {
//         snprintf(name, sizeof name, "%s-%d", "thread", i);
//         pthread_create(tid + i, nullptr, threadRun, (void *)name);
//         sleep(1); // 缓解传参的bug
//     }

//     while (true)
//     {
//         cout << "main thread, pid: " << getpid() << endl;
//         sleep(3);
//     }
// }